﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;

public class UpdateText : MonoBehaviour
{
    #region UI组件
    public Text _text;//接收聊天内容的文本框
    public InputField _input;//用户输入框
    private string str;//获得用户输入的数据 =_input.text;
    #endregion

    //管理数据的类
    private DataMgr _sendData;

    //发送消息的线程
    private Thread sendThread;

    //用户的昵称 PlayerName
    private string pName;

    private void Start()
    {
        //获得数据管理类
        //_sendData = Camera.main.gameObject.GetComponent<DataMgr>();
        _sendData = GetComponent<DataMgr>();
    }

    // Update is called once per frame
    private void Update()
    {
        //每一帧都更新聊天内容的文本框
        GetStr();
    }

    //接收数据 更新聊天窗口的方法
    private void GetStr()
    {
        if (_sendData.r_message != null)
        {
            //从数据管理类里,获得r_message接收到的数据
            string s = _sendData.r_message;
            //如果存在消息 就负责给聊天界面text组件的text属性 追加文本数据
            //"\n"表示换行的意思
            if (s != null)
            {
                _text.text += s + "\n";//\n表示换行符
                                       //释放已接收的数据
                _sendData.r_message = null;
                s = null;
            }
            else
            {
                return;
            }
        }
        else
        {
            return;
        }


    }

    #region 发送数据

    //发送登录消息,需要绑定到用户昵称注册界面的确定按钮
    public void LoginSend()
    {
        //构造发送消息的线程 并且启动线程 通过委托指定(调用)发送消息的方法
        sendThread = new Thread(delegate ()
        {
            _sendData.Send("login");//调用Send方法,给服务端发送一个login指令,告诉服务器我上线了.
        });
        sendThread.Start();
    }

    //SendStr方法,才是给发送按钮调用的.
    public void SendStr()
    {
        //如果昵称等于空 就进行赋值
        if (pName == null)
        {
            pName = GetComponent<Register>().playerName;
        }
        //获得用户输入框的数据
        str = _input.text;
        //释放输入框输入的文本
        _input.text = null;
        //构造发送消息的线程 并且启动线程=>也就是执行SendText方法
        sendThread = new Thread(SendText);
        sendThread.Start();
    }

    private void SendText()
    {
        if (str != null)
        {
            //调用发送数据的方法,发送的内容为昵称:消息体
            _sendData.Send(pName + ":" + str);
            str = null;//释放数据
        }
        //中止线程
        sendThread.Abort();
    }
    #endregion


    #region 程序退出的时候调用
    //退出指令
    private void QuitOrder()
    {
        //向服务端发送 quit 指令
        sendThread = new Thread(delegate ()
        {
            _sendData.Send("quit");
        });
        sendThread.Start();
    }



    /// <summary>
    /// 程序退出时候调用 但强制关闭应用程序的时候是无法调用的
    /// </summary>
    private void OnApplicationQuit()
    {
        QuitOrder();//向客户端发送退出指令
        if (sendThread != null)
        {
            //终止线程,如果不终止,容易造成应用程序失去响应的情况.
            sendThread.Abort();
        }
    }
    #endregion

}
